package work.thread_eg.concurrent.volatile_eg;

import java.util.ArrayList;
import java.util.List;

/**
 * volatile不能保证多个线程对变量修改带来的不一致性问题  volatile不能代替synchronized
 * volatile有可见性 但不能保持原子性
 */
public class VolatileTest01 {
    volatile int count = 0;

    void m() {
        //  count ++不是原子性的 至少三条指令 可能会被打断
        for(int i=0 ; i<10000; i++) {
            count ++;
        }
    }
    public static void main(String[] args) {
        VolatileTest01 t = new VolatileTest01();
        List<Thread> threads = new ArrayList<>();
        // 这里10个线程 volatile依然有数据不一致的问题
        // 第1个线程把count从0加到1 写回主内存
        // 第2个和第3个线程都拿到最新的1 都加到2 都写回主内存 但是count就少加了1次
        for(int i=0 ; i<10; i++) {
            threads.add(new Thread(t::m,"thread" + i));
        }
        threads.forEach(o->o.start());
        // 10个线程跑完之后
        threads.forEach(o->{
            try {
                o.join();
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println(t.count);


    }
}
